#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @Time   : 2021/7/16 0:43
# @Author : cjw
import os
import time
import shutil
import pytest

from use_custom_api.setting import RESULT_PATH, REPORT_PATH, LOG_PATH


class RunCase:
    now_time = time.strftime('%Y_%m_%d_%H_%M_%S')  # 格式化的当前时间
    allure_result = os.path.join(RESULT_PATH, now_time)  # 结果目录
    allure_report = os.path.join(REPORT_PATH, now_time)  # 报告目录
    log_file = os.path.join(LOG_PATH, f'log_{time.strftime("%Y-%m-%d")}.log')  # 日志文件

    @classmethod
    def run(cls, is_result_report_clean: bool = False, clean_result: bool = False,
            clean_report: bool = False, is_auto_open_report: bool = True,
            host: str = '127.0.0.1', port: int = 8889):
        """
        案例执行
        1、只有一个result和report目录的情况下，需要同时清空目录内容，再生成结果和报告
        2、根据时间在result和report目录下生成时间目录，则不需要清空目录内容，在新目录下生成结果和报告
        :param is_result_report_clean: 是否清空allure用例执行结果收集目录和报告目录数据
        :param clean_result: 删除result目录所有文件
        :param clean_report: 删除report目录所有文件
        :param is_auto_open_report: 是否自动启动allure测试报告
        :param host: 启动ip
        :param port: 启动端口
        :return:
        """
        # 删除result目录文件
        if clean_result:
            shutil.rmtree(RESULT_PATH)
            os.mkdir(RESULT_PATH)

        # 收集测试结果，生成报告, 启动报告
        if is_result_report_clean:
            # 清空allure收集的用例执行结果数据和生成的测试报告
            # pytest.main(['--alluredir', RESULT_PATH, '--clean-alluredir', '--log-file', cls.log_file])
            pytest.main(['--alluredir', RESULT_PATH, '--clean-alluredir'])  # 使用自定义的logger打印文件
            cls.generate_report(is_result_report_clean, clean_report)

            # 启动报告
            cls.open_report(RESULT_PATH, is_auto_open_report, host, port)
        else:
            # 根据时间创建新的文件夹，在新的文件夹中生成allure收集的用例执行结果数据并生成测试报告
            # pytest.main(['--alluredir', cls.allure_result, '--log-file', cls.log_file])
            pytest.main(['--alluredir', cls.allure_result])  # # 使用自定义的logger打印文件
            cls.generate_report(is_result_report_clean, clean_report)

            # 启动报告
            cls.open_report(cls.allure_result, is_auto_open_report, host, port)

    @classmethod
    def generate_report(cls, is_clean: bool = False, clean_report: bool = False):
        """
        打开或者生成测试报告
        :param is_clean: 是清空测试报告记录
        :param clean_report: 是否清空测试报告目录
        :return:
        """
        # 删除报告目录并重新创建
        if clean_report:
            shutil.rmtree(REPORT_PATH)
            os.mkdir(REPORT_PATH)

        # 生成测试报告
        if is_clean:
            # 清空报告目录的数据，然后生成报告
            command = f'allure generate {RESULT_PATH} -o {REPORT_PATH} --clean'
        else:
            # 根据时间创建新的文件夹，在新的文件夹生成报告
            command = f'allure generate {cls.allure_result} -o {cls.allure_report}'
        os.popen(command)

    @classmethod
    def open_report(cls, path: str, is_auto: bool = True, host: str = '127.0.0.1',
                    port: int = 8889):
        """
        打开测试报告，如果是自动打开测试报告，传入的是result路径，否则传入report路径
        :param path: 结果或者报告的路径
        :param is_auto: 是否自动打开
        :param host: 启动ip
        :param port: 启动端口
        :return:
        """
        if is_auto:
            # 使用默认浏览器自动打开测试报告，在线查看报告
            command = f'allure serve {path}'
        else:
            # 生成访问测试报告的服务
            command = f'allure open -h {host} -p {port} {path}'
        os.popen(command)


if __name__ == '__main__':
    RunCase.run()
